package 
{
	import fl.transitions.*;
	import fl.transitions.easing.*;
	import flash.display.MovieClip;
	import flash.display.Stage;
	import flash.events.MouseEvent;
	import flash.display.Shape;
	import flash.display.Sprite;
	
	import flash.utils.Timer;
	
	import flash.events.Event;
	import flash.events.TimerEvent;
	
	/**
	 * Esta es la clase encargada de controlar las acciones de los vectores
	 * presentes en ele scenario
	 * @author ... STEVENS PINEDA, GERMAN CAÑON, SEBASTIAN GONZALES
	 */
	public class Mosquito extends MovieClip
	{
		private var x1:int
		private var x2:int
		private var y1:int
		private var y2:int
		
		private var xI:int
		private var yI:int
		private var xF:int
		private var yF:int
		
		private var angulo:int
		
		private var tweenX:Tween;
		private var tweenY:Tween;
		
		public var nivel:BarraNivel
		
		private const RADIO_MOVIMIENTO:int = 50;
		
		private var context:Escenario
		private var timer:Timer;
		
		private var estado:Boolean
		
		/**
		 * Constructor del vector
		 * 
		 * @param	x1 posision inicial respecto a x en el escenario
		 * @param	y1 posision inicial respecto a y en el escenario
		 * @param	x2 posision objetivo respecto a x en el escenario
		 * @param	y2 posision objetivo respecto a y en el escenario
		 * @param	nivel vida inicial del vector
		 * @param	context contexto
		 */
		public function Mosquito(x1:int, y1:int, x2:int, y2:int, nivel:BarraNivel, context:Escenario) {
			
			this.x1 = x1
			this.x2 = x2
			this.y1 = y1
			this.y2 = y2
			
			this.nivel = nivel
			
			this.context = context
			
			x = Math.round(Math.random() * (x2 - x1 - width)) + (x1 + width/2);
			y = Math.round(Math.random() * (y2 - y1 - height)) + (y1 + height/2);

			xI = x
			yI = y
			
			timer = new Timer(3500, 0);
			
			estado = true;

		}
		
		/*
		 * Este es el metodo encargado de iniciar las acciones del movimiento de los vectores
		 * */
		public function run() {
			
			var angulo:int 
			
			while (!isZone()) {
				
				rotation = angulo + 45
				
				xF = Math.round(Math.random() * (x2 - x1 - width)) + (x1 + width/2);
				yF = Math.round(Math.random() * (y2 - y1 - height)) + (y1 + height / 2) ;
				
				rotation = (180*Math.atan2(yF-yI,xF-xI))/Math.PI + 90
			}
		
		
			var dXY:Number = Math.sqrt(Math.pow(xF - xI, 2) + Math.pow(yF - yI, 2));

			var time:Number = dXY*3 / 100;
			
			tweenX = new Tween(this, "x", null, xI, xF, time, true);
			tweenY = new Tween(this, "y", null, yI, yF, time, true);
			
			tweenX.start()
			tweenY.start()
			
			timer.start();
			timer.addEventListener(TimerEvent.TIMER, atacar);
			
			tweenY.addEventListener(TweenEvent.MOTION_FINISH, parar);
			tweenY.addEventListener(TweenEvent.MOTION_CHANGE, movingTween);
		}
		
		/**
		 * Metodo encargado de atacar a una persona proxima al vector
		 * y mermar su salud
		 * @param	e origen del evento
		 */
		private function atacar(e:Event) {
			
			var personas:Array = context.getPersonas()
			var distancia:int;
			
			distancia = Math.round(Math.sqrt( (context.personaje.x - x) * (context.personaje.x - x) + (context.personaje.y - y) * (context.personaje.y - y)))
			
			if (distancia <= 50) {
				infectarPj()
			}
			
			for (var i:int = 0; i < personas.length; i++ ) {
					
				distancia = Math.round(Math.sqrt( (personas[i].x - x) * (personas[i].x - x) + (personas[i].y - y) * (personas[i].y - y)))
				
				if (distancia <= 100) {
					infectar(personas[i])
				}
				
			}
		}
		
		/**
		 * infecta al personaje decrementando su salud
		 */
		private function infectarPj():void 
		{
			var nivel:BarraNivel = context.personaje.nivel
			
			nivel.addEstado(-6)
			
			if (nivel.estado <= 0) {
				context.termina = true
				context.ganar=false
			}
		}
		
		/**
		 * Infecta una persona decrementando su salud
		 * @param	persona a la que se infecta
		 */
		private function infectar(persona:Persona):void {
			
			var nivel:BarraNivel = persona.nivel
			
			nivel.addEstado( -3)
			
			this.nivel.addEstado(2)
			
			if (nivel.estado <= 0) {
				context.termina = true
				context.ganar=false
			}
		}
		
		/**
		 * Realiza el movimiento del moviclip
		 * @param	e
		 */
		private function movingTween(e:Event):void{
			
			if(estado){
				
				nivel.x = this.x - nivel.width /2
				nivel.y = this.y - (this.height / 2)

				if (nivel.estado <= 0) {
					this.visible = false
					this.nivel.visible = false
					context.addMosquitosMuertos()
					this.removeEventListener(TweenEvent.MOTION_CHANGE, movingTween)
					estado=false
				}
			}
		}		
		
		
		/*
		 * 
		 * Esta funcion determina sii el punto generado aleatoriamente esta dentro de la zona 
		 * cubierta por los mosquitos.
		 * */
		private function isZone():Boolean {
			
			if (xF >= x1 && xF <= (x2 - width)  && yF >= y1 && yF <= (y2 - height)) {
				return true
			}
			else {
				return false
			}
		}
		
		/**
		 * Detiene la ejecucion del Vector
		 * @param	e origen del evento
		 */
		 
		private function parar(e:TweenEvent):void
		{
			xI = xF
			yI = yF
			x = xI
			y = yI
			xF = 0
			yF = 0
			run()
		}
		
		/**
		 * Asigna un estado de vida del vector
		 * @param	estado nuevo valor
		 */
		public function setEstado(estado:Boolean):void {
			this.estado = estado
		}
		
		public function getX():int {
			return x
		}
		
		public function getY():int {
			return y
		}
		
		public function setY(y:int) {
			this.y = y
		}
		
		public function setX(x:int) {
			this.x = x
		}
		
		public function getAnngulo():int {
			return angulo
		}
		
		public function setAngulo(angulo:int) {
			this.angulo = angulo
		}
		
		
		
	}
	
}